package client;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import commun.RemoteJoueur;
import commun.RemoteServeur;

public class Artificiel extends UnicastRemoteObject implements RemoteJoueur, Runnable,Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static int Jartif_Count = 0;
	private String name = "CPU_";
	String adver;
	private static RemoteServeur server;
	private boolean continuer=true;
	private int tailleMatric;
	private Thread threadJArtif;
	private int sleepDuration =1000;
	private static ArrayList<Thread> vps= new ArrayList<Thread>(3);

	public Artificiel() throws RemoteException {
		Jartif_Count++;
	}
	@SuppressWarnings("deprecation")
	public void run() {
		int j=0;
		try {
			String[] users = new String[server.getListJoueurs().size()];
			for(String s :server.getListJoueurs().keySet()){
				users[j]=s;
				j++;
			}

			for(RemoteJoueur rcc:server.getListJoueurs().values()){
				rcc.updateListeJoueur(users);
			}
		} catch (RemoteException e1) {
			e1.printStackTrace();
		}
	
		try {
			tailleMatric=server.getTailleMatric(name, adver);
		} catch (RemoteException e2) {
			e2.printStackTrace();
		}
		while(continuer){
			try{
				if(server.StartNewPartieArtif(name,"",adver)){
					while(server.getNbTour(name, adver)>0){
						System.out.println(server.SubmitAndGetResult(name, (int)(Math.random()*tailleMatric),(int)(Math.random()*tailleMatric),adver ,tailleMatric));
						Thread.sleep(1000);
					}
					this.threadJArtif.stop();

				}
			}catch (RemoteException e1) {
				e1.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			try {
				Thread.sleep(sleepDuration );
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}
	/**
	 * Modifier le serveur de ce joueur artificiel
	 * @param crapetteServeur le serveur a affecte a ce joueur artificiel
	 */
	public void setServer(RemoteServeur remoreServeur) {

		server = remoreServeur;

		try {
			name  = "CPU_"+Jartif_Count;
			server.connect(name, this);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
	public void startArtificiel(String id,String client) throws RemoteException {
		this.name=client;
		adver=id;
		threadJArtif = new Thread(this);
		this.setThread(threadJArtif);
		threadJArtif.start();
		this.continuer=true;
	}
	public static RemoteServeur getRcServer() {
		return server;
	}
	/**
	 * Modifier le thread de ce joueur artificiel
	 * @param th le thread a affecte a ce joueur artificiel
	 */
	public void setThread(Thread th){
		if(!vps.contains(th))
			vps.add(th);
	}

	@Override
	public boolean IsAcceptedNewGame(String id, String client,int nbTour,String mode,int tailleMatric)throws RemoteException {return false;}
	@Override
	public boolean IsAcceptedNewGame2(String id, String client,int tailleMatric)throws RemoteException {return false;}
	@Override
	public void discuter(String id, String message, String client)throws RemoteException {}
	@Override
	public String getName() throws RemoteException {return name;}
	@Override
	public void updateListeJoueur(String[] clients) throws RemoteException {}
	@Override
	public boolean IsAcceptedReprendrePartie(String id,String client ,int [][] matrix ,int nbTour,String mode,int gainId,int gainClient, String choixId ,String choixClient,int tailleMatric)throws RemoteException {return false;}

}
